"""
java的循环有三种方式 while循环 do{逻辑}while(条件)，for循环
python循环有两种 for循环和while循环
"""

"""
while循环 格式 
    while 条件: 
        逻辑
    else:
        逻辑
执行流程:先判断while语句，根据while后面的条件进行判定 
为true执行循环体(while中逻辑)，执行完毕继续判断，为true继续执行
直到判断结果为false，那么会终止运行。如果循环有else语句，执行else的代码逻辑
注意:和java一样，这里就有可能出现死循环。
"""
# 例子 需要整数求和 问1+2...+n加到多少的时候结果会大于20000，求最小值
index = 1
count = 0
while count <= 20000:
    count += index
    # 注意bug 最后一次其实已经大于20000了 但是还做了index+1操作 导致程序数据计算不对
    # 此时需要判定条件 只有总数小于20000才做++操作
    if count <= 20000:
        index += 1
# else 部分可以写，也可以不写
else:
    print("此时和的值大于20000，目前的数是", index, "1+到该数的和是", count)

"""
练习:计算1到1000以内奇数的和
"""
index = 1;
count = 0
while index < 1000:
    if index % 2 != 0:
        count += index
    index += 1
else:
    print("和为", count)

"""
练习:
计算水仙花数是指一个 n 位数（n≥3 ），它的每个位上的数字的 n 次幂之和等于它本身（例如：1**3 + 5**3 + 3**3 = 153）
求3000以内所有的水仙花数
"""
num = 100
while num < 3000:
    if num < 1000:
        a = num // 100  # 百位数字
        b = (num - a * 100) // 10  # 十位数字=（总数-整百数）/10取整数
        c = num % 10  # 个位数字
        if a ** 3 + b ** 3 + c ** 3 == num:
            print("1000以内逻辑", num, "是水仙花数")
    else:
        a = num // 1000  # 千位数字
        b = (num - a * 1000) // 100  # 百位数字=(总数-整千数)/100取整数
        c = (num - a * 1000 + b * 100) // 10  # 十位数字=(总数-整千数-整百数)/10取整数
        d = num % 10  # 个位数字
        if a ** 4 + b ** 4 + c ** 4 + d ** 4 == num:
            print("1000以内逻辑", num, "是水仙花数")
    num += 1

"""
练习：
用户输入一个数，判断是不是质数
"""
# num = int(input("请输入一个数字"))
# i = 2
# # true代表是质数 false代表不是质数 1和2都是质数
# res_flag = True
# while i < num:
#     if num % i == 0:
#         res_flag = False
#     i += 1
# else:
#     if res_flag:
#         print(num, "是质数")
#     else:
#         print(num, "不是质数")

"""
循环嵌套
打印如下图形观察 第一行1个 第二行2个 说明打印个数是i的循环次数+1，一旦i切换下标就要换行
* 
**
***
****
*****
******

反过来逻辑:第一行6个 第六行1个
****** i=1 j=6
*****  i=2 j=5
****
***
**
*
"""
i = 0
while i < 6:
    j = 0
    while j < i + 1:
        print("*", end='')
        j += 1
    i += 1
    print()

i = 0
while i < 6:
    j = 6
    while j > i + 1:
        print("*", end='')
        j -= 1
    i += 1
    print()

"""
练习：
做一个99乘法表
1*1=1 第一行 i=1 j=2
1*2=2 2*2=4 第二行 i=2 j=1或者2
"""
i = 0
while i < 9:
    i += 1
    j = 0
    while j < i:
        j += 1
        print(f"{j}*{i}={i * j} ", end="")
    print()

"""
练习:
计算100以内所有的质数
"""
i = 2
while i < 100:
    res_flag = True
    j = 2
    while j < i:
        if i % j == 0:
            res_flag = False
        j += 1
    if res_flag:
        print(i, "是质数")
    i += 1

"""
break和continue关键字 和java一样
continue是跳出当次循环继续循环，多层循环只对当层循环有效
break直接跳出整个循环，多层循环只对当层循环有效
"""